package gob.pe.mtc.licencias.DAO;

import gob.pe.mtc.licencias.beans.Cliente;
import gob.pe.mtc.licencias.beans.Clientelicencia;
import gob.pe.mtc.licencias.beans.Licencia;
import gob.pe.mtc.licencias.utiles.Utiles;

import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class LicenciaDAOImpl extends HibernateDaoSupport implements LicenciaDAO {

	private static final Logger logger = Logger.getLogger(LicenciaDAOImpl.class);
	
	public LicenciaDAOImpl (SessionFactory sessionFactory){
		setSessionFactory(sessionFactory);
	}
	private DataFieldMaxValueIncrementer sequenciaIncrementer;
	public void setSequenciaIncrementer(DataFieldMaxValueIncrementer sequenciaIncrementer) {
		this.sequenciaIncrementer = sequenciaIncrementer;
	}

	public LicenciaDAOImpl(){}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Cliente> listaClientes() {
		
		logger.debug("listando los clientes");
		logger.debug( getHibernateTemplate().find("from Cliente") );
		return getHibernateTemplate().find("from Cliente");
	}
	@SuppressWarnings("unchecked")
	@Override
	public List<Clientelicencia> listaLicencias(Clientelicencia cliente) {
			
		Criteria crit = getSession().createCriteria(Clientelicencia.class);
		if(cliente.getCliente()!=null){
			if(!Utiles.nullToBlank(cliente.getCliente().getNombres()).equals("")){
				crit.add(Restrictions.eq("cliente.nombres",cliente.getCliente().getNombres()));
			}
			if(!Utiles.nullToBlank(cliente.getCliente().getApellidoPat()).equals("")){
				crit.add(Restrictions.eq("cliente.apellidoPat",cliente.getCliente().getApellidoPat()));
			}
			if(!Utiles.nullToBlank(cliente.getCliente().getApellidoMat()).equals("")){
				crit.add(Restrictions.eq("cliente.apellidoMat",cliente.getCliente().getApellidoMat()));
			}
		}
		if(!Utiles.nullToBlank(cliente.getFechaOtorgamiento()).equals("")){
			crit.add(Restrictions.eq("fechaOtorgamiento",cliente.getFechaOtorgamiento()));
		}
		if(cliente.getLicencia()!=null){
			if(Utiles.nullToBlank(cliente.getLicencia().getNumero()).equals("")){
				crit.add(Restrictions.eq("licencia.numero()",cliente.getLicencia().getNumero()));
			}
			if(Utiles.nullToBlank(cliente.getLicencia().getTipoLicencia().getDescripcion()).equals("")){
				crit.add(Restrictions.eq("licencia.tipoLicencia.descripcion",cliente.getLicencia().getTipoLicencia().getDescripcion()));
			}
		}
		List<Clientelicencia> lista = crit.list();
		logger.debug("list " + lista.size());
		return lista;
	}
	@SuppressWarnings("unchecked")
	@Override
	public List<Clientelicencia> listaLicencias(int cliente) {
		return getHibernateTemplate().find("from Clientelicencia cli where estado=1 and  cli.cliente.codCliente = ?", new Long(cliente));
	}
	@Override
	public void registratLicencia(Licencia licen) {
		Integer codigo = sequenciaIncrementer.nextIntValue();
		licen.setNumero(codigo+"");
		getHibernateTemplate().persist(licen);
	}

	@Override
	public Licencia obtenerLicencia(Integer codigo) {
		return (Licencia)getHibernateTemplate().find(" from Licencia where codLicencia = ?", new Long(codigo)).get(0);
	}

	@Override
	public Clientelicencia obtenerLicencia(Integer cliente, Integer licencia) {
		Object[] obArr = {new Long(cliente),new Long(licencia)};
		return (Clientelicencia)getHibernateTemplate().find("from Clientelicencia cli where estado=1 and  cli.cliente.codCliente = ? and cli.licencia.codLicencia = ?", obArr).get(0);
	}

	@Override
	public void modificarLicencia(Clientelicencia cedit) {
		getHibernateTemplate().saveOrUpdate(cedit);
		getHibernateTemplate().saveOrUpdate(cedit.getLicencia());
	}	
	
}
